package com.mjf.scala.chapter07

/**
 * 不可变数组：在执行添加或删除操作的时候，会创建新的数组对象
 */
object Scala01_TestArray {
  def main(args: Array[String]): Unit = {

    // 创建不可变数组  方式1
    val arr1: Array[Int] = new Array[Int](5)  // 通过构造器
    // 创建不可变数组  方式2
    val arr2: Array[Int] = Array(1, 2, 3, 4, 5)   // 通过apply方法

    // 访问数组中的元素
    arr1(1) = 10    // 修改数组中的元素
    arr1.update(1, 20)
    println(arr1(1))

    // 遍历数组中的元素
    // 方式1：for循环
//    for(i <- 0 to arr1.length - 1) {
    for(i <- 0 until arr1.length) {
      println(arr1(i))
    }

    println("-----------------")

    // 方式2：for循环
    for(i <- arr1) {
      println(i)
    }

    println("-----------------")

    // 方式3：迭代器
    val it: Iterator[Int] = arr1.iterator
//    for(i <- it) println(i)
    while(it.hasNext) {
      println(it.next())
    }

    println("-----------------")

    // 方式4：增强for循环
    arr1.foreach(println)   // foreach的参数是一个函数，是对当前集合中的元素的具体操作
//    arr1.foreach((i: Int) => {println(i)})

    println("-----------------")

    // 方式5：用指定的字符串连接数组中的元素，形成新的字符串
    println(arr1.mkString("--"))

    println("-----------------")

    // 向数组中添加元素
    // 因为Array是不可变数组，所以在执行添加操作的时候，会创建新的数组对象
    val newArr1: Array[Int] = arr1.+:(30)   // 往数组开始添加元素

    // 在Scala语中，如果运算符方法中包含冒号，并且冒号在后，运算顺序为从右到左
//    val newArr1: Array[Int] = arr1 +: 30  // 编译报错
//    val newArr1: Array[Int] = 30 +: arr1  // 可以解决上面报错
    println(newArr1.mkString("--"))
    println(arr1.mkString("--"))

    val newArr2: Array[Int] = arr1.:+(20)   // 往数组最后添加元素
//    val newArr2: Array[Int] = arr1 :+ 20
    println(newArr2.mkString("--"))

  }
}
